package com.yx1996.day_02;

import com.yx1996.domain.Customer;
import com.yx1996.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.NativeQuery;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
/**
 * 适用于多表查询但特别复杂的业务时
 *
 */
public class testSQL {

    @Test
    //原生sql查询  //返回值为List<Object[]>
    public void fun1(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 开启事务
        Transaction tx = session.beginTransaction();
        //3 执行查询
        //----------------------------------------------------------------
        //4 书写sql语句  注意条件中的字段和对象相对应，与表格无关
        String sql = "select * from cst_customer";
        //获得NativeQuery对象
        NativeQuery query = session.createSQLQuery(sql);
        //接收返回的集合（返回为Object[]集合）
        List<Object[]> list = query.list();
        //3> 根据查询对象获得查询结果
        for(Object[] o:list){
            System.out.println(Arrays.toString(o));
        }
        //----------------------------------------------------------------
        //8 提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联

    }
    @Test
    //原生sql查询  //返回值为List<Customer>
    public void fun2(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 开启事务
        Transaction tx = session.beginTransaction();
        //3 执行查询
        //----------------------------------------------------------------
        //4 书写sql语句  注意条件中的字段和对象相对应，与表格无关
        String sql = "select * from cst_customer";
        //获得NativeQuery对象
        NativeQuery query = session.createSQLQuery(sql);
        //通过addEntity(Customer.class);方法使返回值为List<Customer>
        query.addEntity(Customer.class);
        //接收返回的集合（返回为List<Customer>集合）
        List<Customer> list = query.list();
        //3> 根据查询对象获得查询结果
        System.out.println(list);
        //----------------------------------------------------------------
        //8 提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联

    }
    @Test
    //原生sql查询  条件查询
    public void fun3(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 开启事务
        Transaction tx = session.beginTransaction();
        //3 执行查询
        //----------------------------------------------------------------
        //4 书写sql语句  注意条件中的字段和对象相对应，与表格无关
        String sql = "select * from cst_customer where cust_id=?";
        //获得NativeQuery对象
        NativeQuery query = session.createSQLQuery(sql);
        //设置参数值，（也是第一个问号参数从0开始）
        query.setParameter(1,11l);
        //通过addEntity(Customer.class);方法使返回值为List<Customer>
        query.addEntity(Customer.class);
        //接收返回的集合（返回为List<Customer>集合）
        Customer c = (Customer) query.uniqueResult();
        //3> 根据查询对象获得查询结果
        System.out.println(c);
        //----------------------------------------------------------------
        //8 提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联

    }

    @Test
    //原生sql查询  分页查询
    public void fun4(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 开启事务
        Transaction tx = session.beginTransaction();
        //3 执行查询
        //----------------------------------------------------------------
        //4 书写sql语句  注意条件中的字段和对象相对应，与表格无关
        String sql = "select * from cst_customer limit ?,?";
        //获得NativeQuery对象
        NativeQuery query = session.createSQLQuery(sql);
        //设置参数值，（也是第一个问号参数从0开始）
        query.setParameter(1,0);
        query.setParameter(2,1);
        //通过addEntity(Customer.class);方法使返回值为List<Customer>
        query.addEntity(Customer.class);
        //接收返回的集合（返回为List<Customer>集合）
        List<Customer> list = query.list();
        //3> 根据查询对象获得查询结果
        System.out.println(list);
        //----------------------------------------------------------------
        //8 提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联

    }
}
